#ifndef FILESYSTEM_H_
#define FILESYSTEM_H_

//contrato que una implementacion del fileSystem debe cumplir, sin importar
//en que medio fisico este implementado


//inicializa el fileSystem
void initFileSystem(void);

//esto lo debe redefinir cada implementacion de fileSystem
#define BLOCK_SIZE 0x2000


//funciones de manipulacion de inodos------------------------------------

#include "inode.h"

//busca en el fileSystem el inodo inodeNum y lo deja en inode
//devuelve -1 en caso de error
int readInode(int inodeNum, inode_t * inode);

//busca en el fileSystem el inodo inodeNum y lo escribe
//con lo apuntado por inode
int writeInode(int inodeNum, inode_t * inode);

//libera el inodo inodeNum en el filesystem
void freeInodeByNum(int inodeNum);

//aloca un nuevo inodo en el fileSysten, lo inicializa y lo deja en inode
//devuelve el numero del inodo
int allocInode(inode_t * inode);


//funciones de manipulacion de bloques------------------------------------

//aloca un bloque en el fileSystem y devuelve un numero para identificarlo
int allocBlock();

//en base a un numero de bloque, devuelve un puntero al bloque en memoria
char * getBlock(int blockNum);

//escribe a disco lo apuntado por el bloque en memoria
void writeBlock(int blockNum, char * memDir);

//baja un bloque de memoria a disco. para volver a usar el bloque, hay que
//hacer nuevamente un getBlock sobre el mismo
void putBlock(int blockNum, char * memDir);

//libera los recursos usados por el bloque en el fileSystem
//devuelve 0 si logro liberar el bloque, o el nro del bloque si fallo
int freeBlock(int blockNum);

#endif /* FILESYSTEM_H_ */
